// Package config 配置包，提供数据库配置和连接管理
package config

import (
    "fmt"
    "gorm.io/driver/mysql"
    "gorm.io/gorm"
    "gorm.io/gorm/logger"
    "log"
    "os"
    "time"
    "windsurf-project/internal/domain/entity"
)

// DBConfig 数据库配置结构体
type DBConfig struct {
    Host     string // Host 数据库主机地址
    Port     string // Port 数据库端口
    User     string // User 数据库用户名
    Password string // Password 数据库密码
    DBName   string // DBName 数据库名称
}

// InitDatabase 初始化数据库连接
// 配置并建立数据库连接，同时设置连接池和日志选项
func InitDatabase() (*gorm.DB, error) {
    // 加载环境变量
    if err := LoadEnv(); err != nil {
        return nil, fmt.Errorf("加载环境变量失败: %v", err)
    }

    // 获取数据库配置
    config := GetDBConfig()

    // 配置GORM日志
    gormLogger := logger.New(
        log.New(os.Stdout, "\r\n", log.LstdFlags),
        logger.Config{
            SlowThreshold:             time.Second,
            LogLevel:                  logger.Info,
            IgnoreRecordNotFoundError: true,
            Colorful:                  true,
        },
    )

    // 构建DSN
    dsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8mb4&parseTime=True&loc=Local",
        config.User,
        config.Password,
        config.Host,
        config.Port,
        config.DBName,
    )

    // 建立数据库连接
    db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{
        Logger: gormLogger,
    })
    if err != nil {
        return nil, fmt.Errorf("连接数据库失败: %v", err)
    }

    // 配置连接池
    sqlDB, err := db.DB()
    if err != nil {
        return nil, fmt.Errorf("获取数据库实例失败: %v", err)
    }

    sqlDB.SetMaxIdleConns(10)
    sqlDB.SetMaxOpenConns(100)
    sqlDB.SetConnMaxLifetime(time.Hour)

    // 自动迁移数据库表结构
    if err := db.AutoMigrate(&entity.User{}); err != nil {
        return nil, fmt.Errorf("数据库迁移失败: %v", err)
    }

    return db, nil
}
